// 登录验证功能测试脚本
// 用于验证新的详细错误提示功能

import axios from 'axios';

// 测试配置
const API_BASE_URL = 'http://localhost:4112';

// 创建axios实例
const apiClient = axios.create({
  baseURL: API_BASE_URL,
  timeout: 10000,
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded',
  }
});

// 测试数据
const testCases = [
  {
    name: '测试用户不存在',
    username: 'nonexistent_user_' + Date.now(),
    password: 'test123456',
    expectedError: '用户不存在'
  },
  {
    name: '测试密码错误',
    username: 'test_user', // 假设这个用户存在
    password: 'wrong_password',
    expectedError: '密码错误'
  },
  {
    name: '测试账号被禁用',
    username: 'disabled_user', // 假设这个用户被禁用
    password: 'test123456',
    expectedError: '账号已被禁用'
  },
  {
    name: '测试正常登录',
    username: 'valid_user', // 假设这个用户存在且正常
    password: 'correct_password',
    expectedSuccess: true
  }
];

// 测试函数
async function testLoginValidation() {
  console.log('🔐 开始测试登录验证功能...\n');

  for (const testCase of testCases) {
    console.log(`📋 ${testCase.name}...`);
    
    try {
      const response = await apiClient.post('/login', 
        `username=${testCase.username}&password=${testCase.password}`
      );
      
      if (response.data.code === 200) {
        if (testCase.expectedSuccess) {
          console.log('✅ 登录成功（符合预期）');
          console.log(`   Token: ${response.data.data.token.substring(0, 20)}...`);
        } else {
          console.log('❌ 登录成功（不符合预期）');
        }
      } else {
        const errorMessage = response.data.msg;
        if (testCase.expectedError && errorMessage.includes(testCase.expectedError)) {
          console.log('✅ 错误信息正确');
          console.log(`   错误信息: ${errorMessage}`);
        } else if (testCase.expectedError) {
          console.log('❌ 错误信息不符合预期');
          console.log(`   期望: ${testCase.expectedError}`);
          console.log(`   实际: ${errorMessage}`);
        } else {
          console.log('❌ 登录失败（不符合预期）');
          console.log(`   错误信息: ${errorMessage}`);
        }
      }
    } catch (error) {
      if (error.response && error.response.data) {
        const errorMessage = error.response.data.msg;
        if (testCase.expectedError && errorMessage.includes(testCase.expectedError)) {
          console.log('✅ 错误信息正确');
          console.log(`   错误信息: ${errorMessage}`);
        } else {
          console.log('❌ 错误信息不符合预期');
          console.log(`   期望: ${testCase.expectedError}`);
          console.log(`   实际: ${errorMessage}`);
        }
      } else {
        console.log('❌ 网络错误或其他异常');
        console.log(`   错误: ${error.message}`);
      }
    }
    
    console.log(''); // 空行分隔
  }
}

// 测试边界情况
async function testEdgeCases() {
  console.log('🔍 测试边界情况...\n');

  const edgeCases = [
    {
      name: '测试空用户名',
      username: '',
      password: 'test123456',
      expectedError: '用户名不能为空'
    },
    {
      name: '测试空密码',
      username: 'test_user',
      password: '',
      expectedError: '密码不能为空'
    },
    {
      name: '测试特殊字符用户名',
      username: 'test@user#$%',
      password: 'test123456',
      expectedError: '用户不存在'
    },
    {
      name: '测试超长用户名',
      username: 'a'.repeat(100),
      password: 'test123456',
      expectedError: '用户不存在'
    }
  ];

  for (const testCase of edgeCases) {
    console.log(`📋 ${testCase.name}...`);
    
    try {
      const response = await apiClient.post('/login', 
        `username=${testCase.username}&password=${testCase.password}`
      );
      
      if (response.data.code === 200) {
        console.log('❌ 应该返回错误');
      } else {
        const errorMessage = response.data.msg;
        console.log('✅ 返回错误信息');
        console.log(`   错误信息: ${errorMessage}`);
      }
    } catch (error) {
      if (error.response && error.response.data) {
        const errorMessage = error.response.data.msg;
        console.log('✅ 返回错误信息');
        console.log(`   错误信息: ${errorMessage}`);
      } else {
        console.log('❌ 网络错误或其他异常');
        console.log(`   错误: ${error.message}`);
      }
    }
    
    console.log(''); // 空行分隔
  }
}

// 测试性能
async function testPerformance() {
  console.log('⚡ 测试性能...\n');

  const iterations = 10;
  const startTime = Date.now();
  
  console.log(`执行 ${iterations} 次登录请求...`);
  
  for (let i = 0; i < iterations; i++) {
    try {
      await apiClient.post('/login', 
        `username=test_user_${i}&password=test123456`
      );
    } catch (error) {
      // 忽略错误，只测试响应时间
    }
  }
  
  const endTime = Date.now();
  const totalTime = endTime - startTime;
  const avgTime = totalTime / iterations;
  
  console.log(`✅ 性能测试完成`);
  console.log(`   总时间: ${totalTime}ms`);
  console.log(`   平均时间: ${avgTime.toFixed(2)}ms`);
  console.log(`   每秒请求数: ${(1000 / avgTime).toFixed(2)}`);
}

// 运行测试
async function runTests() {
  console.log('='.repeat(60));
  console.log('   登录验证功能测试');
  console.log('='.repeat(60));
  
  await testLoginValidation();
  await testEdgeCases();
  await testPerformance();
  
  console.log('\n' + '='.repeat(60));
  console.log('   测试完成');
  console.log('='.repeat(60));
}

// 如果直接运行此脚本
if (import.meta.url === `file://${process.argv[1]}`) {
  runTests().catch(console.error);
}

export {
  testLoginValidation,
  testEdgeCases,
  testPerformance,
  runTests
};
